var express = require('express');
var router = express.Router();

const user = require("../sql/user");
const sql = require("../sql/sql")

const uuid = require("node-uuid");
const md5 = require("md5");

const tools = require("../tools");

const jwt = require("jsonwebtoken");

/**
* @apiGroup 用户信息
* @api {get} /api/user/sendMsg 短信验证码
* @apiVersion 0.0.0
* @apiDescription 发送短信验证码
* @apiParam {String} tel 接收短信验证码的手机号
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"请求成功",
*    "code":"123456"
* }
* @apiSampleRequest http://localhost:3000/api/user/sendMsg
*/

// 发送短信验证码
router.get('/sendMsg', function(req, res, next) {

    let rn = tools.randomNum(4);

    let tel = req.query.tel;
    // 根据手机号查询用户集合
    sql.find(user, {tel}, {}).then(data=>{
        // 如果查询到手机号记录
        if(data.length > 0){
            // 验证账户名和密码是否为空
            if(data[0].userName && data[0].passWord){
                // 如果不为空，表示该手机号已经被注册
                res.send({
                    state:201,
                    title:"该手机号已被注册"
                })
            }else{
                // 如果为空，表示只是发送过短信验证码，重新发送一条验证码，并更新该手机号对应的验证码即可
                tools.sendMsg(tel,rn).then(()=>{
                    sql.update(user,{tel},{
                        code:rn
                    })
                    res.send({
                        state:200,
                        title:"已经发送过验证码，重新发送",
                        code:rn     // 测试，将来要删的
                    })
                })
            }
        }else{
            // 没有查询到记录
            // 表示手机号没有被注册
            // 根据手机号发送验证码，并在发送成功后将手机号和验证码一起插入用户集合
            tools.sendMsg(tel,rn).then(()=>{
                sql.insert(user,{
                    tel,
                    code:rn
                })
                res.send({
                    state:200,
                    title:"短信验证码发送成功",
                    code:rn     // 测试，将来要删的
                })
            })
        }
    })
});



/**
* @apiGroup 用户信息
* @api {post} /api/user/register 用户注册
* @apiVersion 0.0.0
* @apiDescription 用户注册
* @apiParam {String} userName 用户名
* @apiParam {String} tel 手机号
* @apiParam {String} code 短信验证码
* @apiParam {String} passWord 密码
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
res.send({
    state:201,
    title:"用户名已被注册"
})
res.send({
    state:202,
    title:"请先发送验证码"
})
res.send({
    state:203,
    title:"一个手机号只允许注册一个账号"
})
res.send({
    state:204,
    title:"验证码不正确"
})
res.send({
    state:200,
    title:"注册成功"
})
* @apiSampleRequest http://localhost:3000/api/user/register
*/
// 用户注册
router.post('/register', function(req, res, next) {
    // 手机号（验证码）用户名+密码
    const {tel,userName,code,passWord} = req.body;
    // 获取表单信息，验证用户名是否被注册过
    sql.find(user,{userName},{}).then(data=>{
        if(data.length > 0){
            // 如果注册过，提示该用户名已被占用
            res.send({
                state:201,
                title:"用户名已被注册"
            })
        }else{
            // 如果没有被注册，继续下一步
            // 验证手机号是否存在
            sql.find(user,{tel},{}).then(data2=>{
                // 如果手机号不存在，直接提醒用户先获取短信验证码
                if(data2.length <= 0){
                    res.send({
                        state:202,
                        title:"请先发送验证码"
                    })
                }else if(data2[0].userName){
                    // 如果手机号存在，继续下一步
                    // 根据当前手机号，验证用户名是否为空
                    // 用户名不为空，提示一个手机号只能注册一个用户
                    res.send({
                        state:203,
                        title:"一个手机号只允许注册一个账号"
                    })
                }else if(data2[0].code == code){
                    // 用户名为空，继续下一步
                    // 校验验证码是否正确
                    // 如果验证码正确，给密码加密，以 手机号 为条件，更新数据库的数据
                    sql.update(user,{tel},{
                        userId:"user"+uuid.v1(),
                        userName,
                        nickName:"临时用户",
                        passWord:md5(passWord),
                        email:"",
                        avatar:"",
                        birthday:Date.now(),
                        sex:1,
                        hobby:[],
                        regTime:Date.now(),
                        lastTime:0,
                        loginState:0
                    })
                    res.send({
                        state:200,
                        title:"注册成功"
                    })
                }else{
                    // 如果验证码不正确，提醒用户验证码错误
                    res.send({
                        state:204,
                        title:"验证码不正确"
                    })
                }
            })
        }
    })
});

/**
* @apiGroup 用户信息
* @api {get} /api/user/login 用户登录
* @apiVersion 0.0.0
* @apiDescription 用户登录，用户名或手机号只需要输入一个即可
* @apiParam {String} userName 用户名
* @apiParam {String} tel 手机号
* @apiParam {String} passWord 密码
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {String} id 登录用户的id
* @apiSuccessExample {json} Success-Response:
res.send({
    state:201,
    title:"用户名没有注册"
})
res.send({
    state:202,
    title:"密码不符"
})
res.send({
    state:200,
    title:"登录成功",
    id:用户id
})
* @apiSampleRequest http://localhost:3000/api/user/login
*/

// 用户登录
router.get('/login', function(req, res, next) {
    // 用户名或手机号登录
    const {userName="",tel="",passWord} = req.query;
    // 首先验证用户名或手机号是否存在
    sql.find(user,{$or:[{userName},{tel}]},{_id:0,__v:0}).then(data=>{
        // 不存在，则提示用户用户名未注册
        if(data.length <= 0){
            res.send({
                state:201,
                title:"用户名或手机号未注册"
            })
        }else{
            // 存在，继续下一步
            // 验证密码是否和用户名或手机号匹配
            if(md5(passWord) === data[0].passWord){

                const token = jwt.sign({
                    userId: data[0].userId,
                    isLogin:"ok"
                }, "千锋H5，牛！", {
                    expiresIn: 24 * 60 * 60
                });

                // 匹配，提示登录成功
                res.send({
                    state:200,
                    title:"登录成功",
                    id:data[0].userId,
                    token
                })

                sql.update(user, {userId:data[0].userId},{
                    lastTime:Date.now(),
                    loginState:1
                })
            }else{
                // 不匹配，提示用户密码不符
                res.send({
                    state:202,
                    title:"用户名或手机号与密码不符"
                })
            }
        }
    })
})


/**
* @apiGroup 用户信息
* @api {get} /api/user/getUser 获取个人信息
* @apiVersion 0.0.0
* @apiDescription 根据用户id获取个人信息
* @apiParam {String} userId 用户的唯一id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 用户的个人信息
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"获取个人信息成功",
    data:{}
})
* @apiSampleRequest http://localhost:3000/api/user/getUser
*/

// 获取用户个人信息
router.get('/getUser', function(req, res, next) {
    const {userId} = req.query;
    const {token} = req.headers;

    tools.verify(token).then((result)=>{
        sql.find(user, {userId}, {_id:0,__v:0}).then(data=>{
            res.send({
                state:200,
                title:"获取个人信息成功",
                res:result,
                data:data[0]
            })
        })
    }).catch(()=>{
        res.send({
            state:10086,
            title:"登录已失效，请重新登录"
        })
    })
})


/**
* @apiGroup 用户信息
* @api {post} /api/user/setUser 修改个人信息
* @apiVersion 0.0.0
* @apiDescription 根据用户id修改个人信息
* @apiParam {String} userId 用户的唯一id
* @apiParam {Object} userData 用户的要修改的数据
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 用户的个人信息
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"获取个人信息成功",
    data:{}
})
* @apiSampleRequest http://localhost:3000/api/user/setUser
*/

// 修改用户个人信息
router.post('/setUser', function(req, res, next) {
    const {userId} = req.body;
    const {userData} = req.body;

    console.log(userData);

    const {token} = req.headers;

    tools.verify(token).then((result)=>{
        sql.update(user, {userId}, userData).then(()=>{
            sql.find(user, {userId}, {_id:0,__v:0}).then(data=>{
                res.send({
                    state:200,
                    title:"获取个人信息成功",
                    data:data[0]
                })    
            })
        })
    }).catch(()=>{
        res.send({
            state:10086,
            title:"登录已失效，请重新登录"
        })
    })
})


module.exports = router;
